///*
// * 描述： <描述>
// * 修改人： rain
// * 修改时间： 2016年5月22日
// * 项目： rainhy-webcore
// */
//package com.rainhy.incrementer.producer;
//
//import java.util.HashMap;
//import java.util.Map;
//
//import javax.annotation.Resource;
//
//import org.springframework.dao.DataAccessResourceFailureException;
//import org.springframework.stereotype.Component;
//
//import com.rainhy.incrementer.context.IncrementerProducer;
//
//
///**
// * 自增长生产者,默认实现
// * 
// * @author rain
// * @version [版本号, 2016年5月22日]
// * @see [相关类/方法]
// * @since [产品/模块版本]
// */
//@Component("rainhy.webcore.incrementer.producer.default")
//public class IncrementerProducerByDefault implements IncrementerProducer {
//    
//    /** 自增长 Service */
//    @Resource(name = "rainhy.webcore.incrementer.service")
//    private IncrementerService service;
//    
//    /** 下一个值 */
//    private Map<String, Long> nextMap = new HashMap<>();
//    
//    /** 最大值 */
//    private Map<String, Long> maxMap = new HashMap<>();
//    
//    @Override
//    public String getDataSourceType() {
//        return "default;
//    }
//    
//    @Override
//    public long getNextValue(String incrementerType, int cacheSize, int startValue) {
//        if (!this.maxMap.containsKey(incrementerType)) {
//            this.maxMap.put(incrementerType, Long.valueOf(startValue));
//            initIncrementerType(incrementerType, startValue);
//        }
//        if (!this.nextMap.containsKey(incrementerType)) {
//            this.nextMap.put(incrementerType, this.maxMap.get(incrementerType));
//        }
//        
//        long maxId = this.maxMap.get(incrementerType).longValue();
//        long nextId = this.nextMap.get(incrementerType).longValue();
//        
//        if (maxId == nextId) {
//            Incrementer incrementer = service.findByIncType(incrementerType);
//            if (incrementer == null) {
//                throw new DataAccessResourceFailureException("incrementer create error!");
//            }
//            
//            incrementer.setIncValue(incrementer.getIncValue() + cacheSize);
//            service.save(incrementer);
//            
//            maxId = incrementer.getIncValue();
//            nextId = maxId - cacheSize + 1;
//            
//            this.maxMap.put(incrementerType, Long.valueOf(maxId));
//        } else {
//            nextId++;
//        }
//        
//        this.nextMap.put(incrementerType, Long.valueOf(nextId));
//        
//        return nextId;
//    }
//    
//    /**
//     * 
//     * 初始化自增长类型(向表插入自增长类型记录)
//     *
//     * @param incrementerType 自增长类型
//     * @param startValue 起始值
//     * 
//     * @return void [返回类型说明]
//     * @exception throws [异常类型] [异常说明]
//     * @see [类、类#方法、类#成员]
//     * @version [版本号, 2016年1月21日]
//     * @author rain
//     */
//    private void initIncrementerType(String incrementerType, int startValue) {
//        Incrementer incrementer = service.findByIncType(incrementerType);
//        if (incrementer == null) {
//            incrementer = new Incrementer();
//            incrementer.setIncType(incrementerType);
//            incrementer.setIncValue(startValue);
//        }
//        service.save(incrementer);
//    }
//    
//    @Override
//    public boolean isSupport() {
//        return true;
//    }
//    
//}
